package com.itheima.jdk;

import com.itheima.dao.HelloWord;
import com.itheima.dao.impl.HelloWordImpl;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;


/**
 * JDK动态代理对象
 */
public class ProxyHelloWord implements InvocationHandler {

    /**
     * 真实对象
     */
    private Object target;


    /**
     * 绑定对象
     * @param obj  真实对象
     * @return     代理对象
     */
    public Object bind(Object obj) {
        target = obj;
        return Proxy.newProxyInstance(
                //得到代理对象的类加载器
                obj.getClass().getClassLoader(),
                //得到代理对象的实现类接口
                obj.getClass().getInterfaces(),
                //定义代理类的对象
                this
        );
    }


    /**
     *
     * @param proxy    代理对象就是用bind方法生成的对象
     * @param method   需要执行的方法
     * @param args     执行方法的参数
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        System.out.println("代理前...");
        System.out.println(proxy.getClass().getName());
        Object obj = method.invoke(target, args);
        System.out.println("代理后...");
        System.out.println("obj: ");
        return obj;
    }
}

/**
 * 测试jdk代理对象
 */
class Test {
    public static void main(String[] args) {
        HelloWord proxy = (HelloWord) new ProxyHelloWord().bind(new HelloWordImpl());
        Object object = proxy.sayHello();
        System.out.println(object);
    }
}
